package main

import (
	"bytes"
	"image"
	"image/color"
	"image/draw"
	"image/jpeg"
	"math/rand"
	"net/http"
	"os"
	"time"

	"github.com/disintegration/imaging"
	"github.com/gin-gonic/gin"
	"github.com/golang/freetype/truetype"
)

// 定义meme结构体
type Meme struct {
	Text     string
	Font     string
	FontSize int
	Color    color.Color
}

// 生成随机meme图片
func generateMeme() ([]byte, error) {
	// 创建一个空白图像
	img := image.NewRGBA(image.Rect(0, 0, 800, 600))
	draw.Draw(img, img.Bounds(), &image.Uniform{color.White}, image.Point{}, draw.Src)

	// 添加随机文本
	memeText := []string{"Hello, World!", "Golang is awesome!", "Meme generated by Go!"}
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	text := memeText[r.Intn(len(memeText))]

	// 绘制文本
	if err := drawText(img, text, 32, color.Black); err != nil {
		return nil, err
	}

	// 应用滤镜， 修复代码,
	// 使用imaging包调整图片对比度
	processed := imaging.AdjustContrast(img, 20)
	// 将NRGBA格式转换为RGBA格式
	// 将NRGBA转换为RGBA格式
	img = image.NewRGBA(processed.Bounds())
	draw.Draw(img, img.Bounds(), processed, processed.Bounds().Min, draw.Src)

	// 将图像转换为JPEG格式
	var buf bytes.Buffer
	if err := jpeg.Encode(&buf, img, &jpeg.Options{Quality: 90}); err != nil {
		return nil, err
	}

	return buf.Bytes(), nil
}

// 绘制文本到图像
func drawText(img *image.RGBA, text string, fontSize int, color color.Color) error {
	// 加载字体
	fontBytes, err := os.ReadFile("arial.ttf")
	if err != nil {
		return err
	}
	font, err := truetype.Parse(fontBytes)
	if err != nil {
		return err
	}

	_ = font
	// 创建绘图上下文,修复代码
	// d := &font.Drawer{
	// 	Dst:  img,
	// 	Src:  image.NewUniform(color),
	// 	Face: truetype.NewFace(font, &truetype.Options{Size: float64(fontSize)}),
	// }

	// // 计算文本位置
	// textWidth := d.MeasureString(text).Ceil()
	// x := (img.Bounds().Dx() - textWidth) / 2
	// y := img.Bounds().Dy() / 2

	// // 绘制文本
	// d.Dot = fixed.Point26_6{X: fixed.I(x), Y: fixed.I(y)}
	// d.DrawString(text)

	return nil
}

// 处理HTTP请求
func getMeme(c *gin.Context) {
	// 生成meme图片
	meme, err := generateMeme()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	// 设置响应头
	c.Header("Content-Type", "image/jpeg")
	c.Header("Content-Disposition", "inline; filename=\"meme.jpg\"")

	// 返回图片
	c.Data(http.StatusOK, "image/jpeg", meme)
}

// 生成随机图标
func generateIcon() ([]byte, error) {
	size := 128
	img := image.NewRGBA(image.Rect(0, 0, size, size))

	// 随机背景颜色
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	bgColor := color.RGBA{
		R: uint8(r.Intn(256)),
		G: uint8(r.Intn(256)),
		B: uint8(r.Intn(256)),
		A: 255,
	}

	// 绘制圆形背景
	drawCircle(img, size/2, size/2, size/2, bgColor)

	// 随机内部形状颜色
	shapeColor := color.RGBA{
		R: uint8(r.Intn(256)),
		G: uint8(r.Intn(256)),
		B: uint8(r.Intn(256)),
		A: 255,
	}

	// 在圆形内部绘制一个较小的圆形
	innerRadius := size / 3
	drawCircle(img, size/2, size/2, innerRadius, shapeColor)

	// 随机选择形状
	switch r.Intn(3) {
	case 0:
		// 圆形
		drawCircle(img, size/2, size/2, size/3, shapeColor)
	case 1:
		// 方形
		drawSquare(img, size/4, size/4, size/2, size/2, shapeColor)
	case 2:
		// 三角形
		drawTriangle(img, shapeColor)
	}

	// 将图像转换为PNG格式
	var buf bytes.Buffer
	// 需要导入 "image/png" 包来使用 png.Encode
	if err := jpeg.Encode(&buf, img, &jpeg.Options{Quality: 90}); err != nil {
		return nil, err
	}

	return buf.Bytes(), nil
}

// 绘制圆形
func drawCircle(img *image.RGBA, x, y, radius int, color color.Color) {
	for i := x - radius; i <= x+radius; i++ {
		for j := y - radius; j <= y+radius; j++ {
			if (i-x)*(i-x)+(j-y)*(j-y) <= radius*radius {
				img.Set(i, j, color)
			}
		}
	}
}

// 绘制方形
func drawSquare(img *image.RGBA, x1, y1, x2, y2 int, color color.Color) {
	for i := x1; i <= x2; i++ {
		for j := y1; j <= y2; j++ {
			img.Set(i, j, color)
		}
	}
}

// 绘制三角形
func drawTriangle(img *image.RGBA, color color.Color) {
	size := img.Bounds().Dx()
	for i := 0; i < size; i++ {
		for j := 0; j <= i; j++ {
			img.Set(i, j, color)
		}
	}
}

// 处理HTTP请求
func getIcon(c *gin.Context) {
	icon, err := generateIcon()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.Header("Content-Type", "image/png")
	c.Header("Content-Disposition", "inline; filename=\"icon.png\"")
	c.Data(http.StatusOK, "image/png", icon)
}

func main() {
	r := gin.Default()
	r.GET("/icon", getIcon)
	r.Run(":8080")
}
